import { getProfileAPI, getUserPhotoAPI, loginApi } from '@/api'
import { getToken, setToken, removeToken } from '@/utils/auth'

const getDefaultState = () => {
  return {
    token: getToken(), // vuex的state值, 使用本地持久化的(刷新时, 默认去本地取一个)
    userInfo: {}, // 用户的基本资料对象 (初始值的类型最好和将来赋予值类型统一)
    name: '',
    avatar: ''
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: state => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token //vuex里state存一份
    setToken(token) // 再给本地也存一份
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  // 删除token
  REMOVE_TOKEN (state) {
    state.token = ''
    removeToken()
  },

  // **********操作userInfo这个变量************
  // 设置用户名
  SET_USER (state, value) {
    // value -> 一会请求到的用户信息对象
    state.userInfo = value
  },
  // 删除用户信息
  REMOVE_USER (state) {
    state.userInfo = {}
  }
}

const actions = {
  // user login
  // 封装  登录-逻辑
  async loginActions ({ commit }, data) {
    const res = await loginApi(data)
    // console.log('1', res.data)
    // 当前在模块内不需要加模块名
    commit('SET_TOKEN', res.data)
    // 把结果返回到调用处
    return res
    // async函数return的值, 都会作为Promise成功的结果
    // 只要不是Promise.reject()
    // 都是成功的值
  },
  // 封装  - 获取用户基本信息
  async getUserInfoActions ({ commit }) {
    // const res = await getProfileAPI()
    // console.log(res)
    const { data: userObj } = await getProfileAPI()
    const { data: photoObj } = await getUserPhotoAPI(userObj.userId)
    // 用户信息对象,交到mutations里保存到userInfo上
    commit('SET_USER', { ...userObj, ...photoObj })
    // 把两个对象都展开, 形成一个全新的对象,传递给userInfo保存
  },
  // 封装 -> 退出登录逻辑(被动退出token过期/ 主动退出)
  loginOutActions ({ commit }) {
    commit('REMOVE_TOKEN')
    commit('REMOVE_USER')
    // state值清除, getters也受到影响
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
